package mpbe.Componentes.TableColEdit;

/*
 * Este codigo es software libre y se encuentra licenciado 
 * bajo los términos de la Licencia Pública General de GNU versión 3 
 * según se encuentra publicada por la Free Software Foundation.
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Autor: Martin Pablo Bellanca <martin.bellanca@gmail.com>
 * web: http://mpbe.blogspot.com/
 */

import java.util.Vector;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ControlEditor;
import org.eclipse.swt.custom.TableCursor;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

public class TableCE {
	private Table table = null;
	private TableCursor cursor = null;
	private ControlEditor editor = null;
	private Vector<ColumnTCE> columnas = null;
	private EditingTCE editando = null;
	
	
	public TableCE(Table etable) {
		table = etable;
		cursor = new TableCursor(etable, SWT.NONE);
		editor = new ControlEditor(cursor);
			editor.grabHorizontal = true;
			editor.grabVertical = true;
		columnas = new Vector<ColumnTCE>();
		editando = new EditingTCE();
		
		// Manejadores de eventos 
		cursor.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent e) {
				//System.out.println("TableCE cursor key pressed");
				if (cursor.getRow()==null) cursor.setSelection(0, 0);
				onCursorKey(e);
			}
		});
		
		cursor.addMouseListener(new MouseAdapter() {
			public void mouseDown(MouseEvent e) {
				onCursorMouseDown();
			}
		});

		table.addMouseListener(new MouseAdapter() {
			public void mouseDown(MouseEvent e) {
				onetableMouseDown(e);
			}
		});
	}
	
	// funciones de eventos
	private void onCursorKey(KeyEvent e) {
		//System.out.println("TableCE on Key press");
		int col = cursor.getColumn();
		ColumnTCE columna = columnas.get(col);
		WidgetsTCE widget = columna.getWidget();
		//WidgetsTCE widget = new TextCE(cursor, SWT.NONE);
		boolean edt = columna.isEditable();
		
		// enter mueve el cursor hacia bajo
		if (e.keyCode == SWT.CR || e.keyCode == SWT.KEYPAD_CR) {
			table.setSelection(cursor.getRow());
			int rowi = table.getSelectionIndex();
			if (rowi<table.getItemCount()-1){
				cursor.setSelection(rowi+1,cursor.getColumn());
				table.setSelection(cursor.getRow());
			}
		}
		// TAB mueve el cursor a la derecha
		else if (e.keyCode == SWT.TAB) { 
			//System.out.println("enter tab");
			table.setSelection(cursor.getRow());
			int rowi = table.getSelectionIndex();
			//int col = cursor.getColumn();
			if (col<table.getColumnCount()-1){
				cursor.setSelection(rowi,col+1);
				//table.setSelection(rowi);
			}
		}
		else if (edt==true){
			// F2 para editar
			if (e.keyCode == SWT.F2) {
				//System.out.println("TableCE cursor F2");
				//TextCE txt = (TextCE)widget;
				//txt.onCursorKeyF2(editando, cursor, editor, table);
				widget.onCursorKeyF2(editando, cursor, editor, table);
			}
			// ingreso de letras como primer caracter para editar
			else if (((e.keyCode >= 'a') && (e.keyCode <= 'z')) || ((e.keyCode >= 'A') && (e.keyCode <= 'Z'))) {
				widget.onCursoKeyChar(editando, cursor, editor, table, e.character);
			}
			// ingreso de numeros como primer caracter para editar
			else if (((e.keyCode >= '0') && (e.keyCode <= '9')) || (e.keyCode == '-') || (e.keyCode == '.')
					|| ((e.keyCode >= SWT.KEYPAD_0) && (e.keyCode <= SWT.KEYPAD_9))
					|| (e.keyCode == SWT.KEYPAD_SUBTRACT) || (e.keyCode == SWT.KEYPAD_DECIMAL)){
				widget.onCursoKeyChar(editando, cursor, editor, table, e.character);
			}
		}
				
		if (table.getSelectionCount()<2) table.setSelection(cursor.getRow()); //********OJO CON ESTO
	}
	private void onCursorMouseDown() {
		//System.out.println("cursor mouse down ");
		//TableCE.this.table.setSelection(2);
		//table.setSelection(2);
		
		int col = cursor.getColumn();
		ColumnTCE columna = columnas.get(col);
		if (columna.isEditable()==true) {
			TableItem row = cursor.getRow();
			editando.startEditing(row, col);
			table.setSelection(row);
			WidgetsTCE widget = columna.getWidget();
			widget.onCursorMouseDown(editando, cursor, editor, table);
		}
	}
	
	private void onetableMouseDown(MouseEvent e) {
		//System.out.println("table mouse down");
		if (e.button==1) {
			if (editando.isEditing() == true) {
				//System.out.println("Se esta editando un control");
				int col = editando.getColumn();
				ColumnTCE columna = columnas.get(col);
				WidgetsTCE widget = columna.getWidget();
				widget.onTableMouseDown(editando);
			}

			if (e.stateMask == SWT.CTRL) { //seleccion con CTRL presionado
				int row = table.indexOf(cursor.getRow());
				if (table.isSelected(row)) 
					table.deselect(row);
				else
					table.select(row);
			}
			if (e.stateMask == SWT.SHIFT) {
				int ini = table.getSelectionIndices()[table.getSelectionCount()-1];
				int fin = table.indexOf(cursor.getRow());
				table.select(ini, fin);
			}
			//Agregar seleccion multiple si esta presionada Shift o Ctrl
			// usar etable.select(arg0);


			cursor.setFocus();
		}
	}
	
	// **************************************
	// funciones de edicion de columnas
	// **************************************
	public TableColumn addColumn(ColumnTCE columna){
		columnas.add(columna);
		return columna.activateColumn(table);
	}
/*	public void setColumn(ColumnTCE columna, int col){
		columnas.set(col, columna);
	}
	public void remColumn(int col){
		columnas.remove(col);
	}*/
	public ColumnTCE getColumn(int col) {
		return columnas.get(col);
	}
	public Vector<ColumnTCE> getColumns() {
		return columnas;
	}
	public void setColumns(Vector<ColumnTCE> columnas) {
		this.columnas = columnas;
	}
	public int getColumnCount() {
		return columnas.size();
	}
	
	//**********************************************************
	// Funciones de Items, Celdas y cursor
	//**********************************************************
	// funciones para agregar rows
	public TableItem addRow(){
		return new TableItem(table, SWT.NONE);
	}
	public TableItem addRow(String[] valores){
		if (valores.length == table.getColumnCount()){
			TableItem row = new TableItem(table, SWT.None);
			for (int ii=0; ii<valores.length; ii++) 
				if (valores[ii]!=null) row.setText(ii, valores[ii]);
			return row;
		}
		else return null;
	}
	
	public TableItem addRowDefault() {
		TableItem row = new TableItem(table, SWT.None);
		String txt = new String();
		for (int ii=0; ii<table.getColumnCount(); ii++) {
			ColumnTCE colTCE = columnas.get(ii);
			if (colTCE.isEditable()==true){
				WidgetsTCE wdg = colTCE.getWidget();
				txt = wdg.TXTDefault;
			}
			else txt = "";
			row.setText(ii, txt);
		}
		return row;
	}
	
	// funciones para insertar rows
	public TableItem insertRow(int index){
		return new TableItem(table, SWT.NONE, index);
		// Cargar valores por defecto
		
	}
	public TableItem insertRow(int index, String[] valores){
		if (valores.length == table.getColumnCount()){
			TableItem row = new TableItem(table, SWT.None, index);
			for (int ii=1; ii<valores.length; ii++) row.setText(ii, valores[ii]);
			return row;
		}
		else return null;
	}
	
	public TableItem insertRowDefault(int index){
		TableItem row = new TableItem(table, SWT.None, index);
		String txt = new String();
		for (int ii=0; ii<table.getColumnCount(); ii++) {
			ColumnTCE colTCE = columnas.get(ii);
			if (colTCE.isEditable()==true){
				WidgetsTCE wdg = colTCE.getWidget();
				txt = wdg.TXTDefault;
			}
			else txt = "";
			row.setText(ii, txt);
		}
		return row;
	}
	
	// funciones para borrar rows
	public void removeRow(int index){
		table.remove(index);
	}
	public void removeAll(){
		table.removeAll();
	}
	
	// devolver row
	public TableItem getRow(int index){
		return table.getItem(index);
	}
	
	// cantidad de rows
	public int getRowsCount() {
		return table.getItemCount();
	}
	
	//	**********************************************************
	// Cambiar valor de celda
	public void setCell(int col, int row, String valor) {
		
		// VERIFICAR SI HAY RESTRICCION EN EL INGRESO DE VALORES (CBO) 
		
		TableItem rw = table.getItem(row);
		rw.setText(col, valor);
	}
	// devolver valor de celda
	public String getCell(int col, int row){
		TableItem rw = table.getItem(row);
		return rw.getText(col);
	}
	
	//	**********************************************************
	// devolver row de cursor TableItem
	public TableItem getCursorRow(){
		return cursor.getRow();
	}
	// devolver ubicacion de cursor (point) row,col
	public Point getCursorLocation(){
		return new Point(table.indexOf(cursor.getRow()), cursor.getColumn());
	}
	// ubicar cursor en point
	public void setLocationCursor(int row, int col){
		cursor.setSelection(row, col);
	}
	public void setLocationCursor(TableItem row, int col){
		table.setSelection(row);
		cursor.setSelection(row, col);
	}

	// Getters ********************************
	public TableCursor getCursor() {
		return cursor;
	}

	public EditingTCE getEditing() {
		return editando;
	}

	public ControlEditor getEditor() {
		return editor;
	}

	public Table getTable() {
		return table;
	}
}
